﻿import store from '/vue/store/index.js'
import router from '/vue/router/index.js'
import el from "/vue/el/index.esm.browser.js";
import { getToken } from '/vue/utils/auth.js' // get token from cookie
import getPageTitle from '/vue/utils/get-page-title.js'
const Message = el.Message;
LoadScript("/vue/libs/nprogress/nprogress.js");
LinkCssOrScss("/vue/libs/nprogress/nprogress.css");

NProgress.configure({ showSpinner: false }) // NProgress Configuration

const whiteList = ['/login'] // no redirect whitelist

router.beforeEach(async (to, from, next) => {
	// start progress bar
	NProgress.start()

	// set page title
	document.title = getPageTitle(to.meta.title)
	// determine whether the user has logged in
	const hasToken = getToken()

	if (hasToken) {
		if (to.path === '/login') {
			// if is logged in, redirect to the home page
			next({ path: '/' })
			NProgress.done()
		} else {
			// determine whether the user has obtained his permission roles through getInfo
			const hasRoles = store.getters.roles && store.getters.roles.length > 0
			if (hasRoles) {
				next()
			} else {//目前用后台方式控制菜单，后台对所有用户都返回[admin,editor]
				try {
					// get user info
					// note: roles must be a object array! such as: ['admin'] or ,['developer','editor']
					const { roles, isDev } = await store.dispatch('user/getInfo')
					// generate accessible routes map based on roles
					const accessRoutes = await store.dispatch('permission/generateRoutes', { roles, isDev })					
					// dynamically add accessible routes
					router.addRoutes(accessRoutes)

					// hack method to ensure that addRoutes is complete
					// set the replace: true, so the navigation will not leave a history record
					next({ ...to, replace: true })
				} catch (error) {
					// remove token and go to login page to re-login
					await store.dispatch('user/resetToken')
					Message.error(error || 'Has Error')
					next(`/login?redirect=${to.path}`)
					NProgress.done()
				}
			}
		}
	} else {
		/* has no token*/

		if (whiteList.indexOf(to.path) !== -1) {
			// in the free login whitelist, go directly
			next()
		} else {
			// other pages that do not have permission to access are redirected to the login page.
			next(`/login?redirect=${to.path}`)
			NProgress.done()
		}
	}
})

router.afterEach(() => {
	// finish progress bar
	NProgress.done()
})
